/**
 * 
 * 广州锐鹏计算机科技有限公司（www.ruipengkj.com）
 * 
 * 
 * Copyright (c) 2011-2012 RUIPENGKJ.Co.Ltd. All rights reserved.
 * 
 * */
package com.ruipengkj.commons.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
 * 说明：
 * 压缩目录工具
 * @Author：李智深
 * @Date：2012-03-14
 */
public class ReduceDirectoryUtil{

	private static ReduceDirectoryUtil instance;
	private String str="";//用来保存第0次递归的路劲
	private int n=0;//是否递归了0次

	private ReduceDirectoryUtil(){}
	
	public static ReduceDirectoryUtil getInstance(){
		if(instance==null){
			instance=new ReduceDirectoryUtil();
		}
		return instance;
	}
	
	public void reduce(String filePath,String zipFileName){
		try {
			//定义压缩流
			ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFileName));
			this.zip(filePath,zos);
			zos.close();//关闭流
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//递归调用压缩方法
	private void zip(String filePath,ZipOutputStream zos)throws Exception{
		File file=new File(filePath);//创建文件对象
		File[] files=file.listFiles();//获取文件夹里面的所有文件对象
		if(n==0){//判断是否的第一次调用
			str=file.getAbsolutePath().substring(0,file.getAbsolutePath().length()-file.getName().length());//拿到文件名之前的路劲
		}
		n++;//加了之后就表示不是第一次调用
		for(int i=0;i<files.length;i++){
			this.zipFile(files[i].getAbsolutePath(),zos,str);//不管什么文件类型,都给压缩函数处理
			if(!files[i].isFile()){//判断是否是文件
				this.zip(files[i].getAbsolutePath(),zos);//不是文件，则递归
			}
		}
		
	}
	ZipEntry entry=null;//初始值为空
	//压缩文件
	private void zipFile(String path,ZipOutputStream zos,String dir)throws Exception{
		File file=new File(path);//获取文件
		String str=file.getAbsolutePath().substring(dir.length());//获取目录名称
		if(file.isFile()){//判断是否是文件
			entry=new ZipEntry(str);//是文件则直接添加
			FileInputStream fis=new FileInputStream(file);
			int len=0;
			byte[] buf=new byte[1024];
			while(true){
				len=fis.read(buf,0,buf.length);
				if(len==-1){
					break;
				}
				zos.write(buf,0,len);
				zos.flush();
			}
		}else{
			entry=new ZipEntry(str+"/");//不是文件，则在其后面加"/"
		}
		zos.putNextEntry(entry);
	}
}
